package com.dp.client.views.clientes;

import java.util.List;

import com.dp.client.dto.ClienteDTO;
import com.dp.client.servicios.clientes.IServiciosCliente;
import com.dp.client.servicios.clientes.IServiciosClienteAsync;
import com.dp.client.util.Alerts;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.thirdparty.guava.common.primitives.Chars;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.PopupPanel;
import com.google.gwt.user.client.ui.DialogBox;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.HasVerticalAlignment;
import com.google.gwt.user.client.ui.HorizontalSplitPanel;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.event.dom.client.ChangeHandler;
import com.google.gwt.event.dom.client.ChangeEvent;

public class ClienteDialog extends PopupPanel {
	private final ClienteDTO clienteDTO;
	
	private TextBox txtNombre;
	private TextBox txtApellido1;
	private TextBox txtApellido2;
	private TextBox txtCorreo;
	private HorizontalPanel horizontalPanel;
	private Button btnCerrar;
	
	public ClienteDialog(final ClienteDTO cliente) {
		super();
		
		FlexTable flowPanel = new FlexTable();
		setWidget(flowPanel);
		flowPanel.setSize("100%", "100%");
		
		flowPanel.setText(0, 0, "Nombre:");
		txtNombre = new TextBox();
		txtNombre.setMaxLength(10);
		flowPanel.setWidget(0, 1, txtNombre);
		
		flowPanel.setText(1, 0, "Apellido 1:");		
		
		flowPanel.setText(2, 0, "Apellido 2:");
		
		flowPanel.setText(3, 0, "Correo:");
		
		txtApellido1 = new TextBox();
		flowPanel.setWidget(1, 1, txtApellido1);
		
		txtApellido2 = new TextBox();
		flowPanel.setWidget(2, 1, txtApellido2);
		
		txtCorreo = new TextBox();
		flowPanel.setWidget(3, 1, txtCorreo);
		flowPanel.getCellFormatter().setVerticalAlignment(1, 1, HasVerticalAlignment.ALIGN_TOP);
		
		horizontalPanel = new HorizontalPanel();
		flowPanel.setWidget(5, 1, horizontalPanel);
		
		Button btnAction = new Button("New button");
		horizontalPanel.add(btnAction);
		
		btnCerrar = new Button("Cerrar");
		btnCerrar.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				cerrar();
			}
		});
		horizontalPanel.add(btnCerrar);
		
		this.clienteDTO = cliente;
		if(cliente == null){ // se crea cliente
			setTitle("Registrar cliente");
			btnAction.setText("Registrar");
		}else { // se modifica cliente
			setTitle("Modificar cliente");
			btnAction.setText("Modificar");
		}
		btnAction.addClickHandler(new ClickHandler() {
			@Override
			public void onClick(ClickEvent event) {
				IServiciosClienteAsync serviciosCliente = GWT.create(IServiciosCliente.class);
				serviciosCliente.registrarCliente(readClienteDTO(), new AsyncCallback<Boolean>() {

					@Override
					public void onFailure(Throwable caught) {
						Alerts.dialogErrorConexion();
					}

					@Override
					public void onSuccess(Boolean result) {
						if(cliente == null)
							Alerts.dialogExitoCreacionDeObjeto("Cliente");
						else
							Alerts.dialogExitoModificacionDeObjeto("Cliente");
						
					}
				});
			}
		});
		
		this.setGlassEnabled(true);
		this.setAnimationEnabled(true);
		
		//init
		if(clienteDTO != null) llenaDatos(clienteDTO);
	}
	private void llenaDatos(ClienteDTO clienteDTO){
		if(clienteDTO == null) return;
		txtNombre.setText(clienteDTO.getNombre());
		txtApellido1.setText(clienteDTO.getApellido1());
		txtApellido2.setText(clienteDTO.getApellido2());
		txtCorreo.setText(clienteDTO.getCorreo());
	}
	private ClienteDTO readClienteDTO(){
		ClienteDTO cliente = this.clienteDTO == null ? new ClienteDTO() : this.clienteDTO;
		cliente.setApellido1(txtApellido1.getText());
		cliente.setApellido2(txtApellido2.getText());
		cliente.setNombre(txtNombre.getText());
		cliente.setCorreo(txtCorreo.getText());
		return cliente;
	}
	void cerrar(){
		this.hide();
	}
}
